package yl.hs.bmipfull.service.finance;

import org.apache.ibatis.annotations.Param;
import yl.hs.bmipfull.pojo.finance.ShipSettleMainEntity;
import yl.hs.bmipfull.pojo.finance.ShipSettleTemp;
import yl.hs.bmipfull.pojo.production.ProductShipOrderEntity;
import yl.hs.bmipfull.viewmodels.PageQuery;
import yl.hs.bmipfull.viewmodels.PageResult;
import yl.hs.bmipfull.viewmodels.SubmitModel;
import yl.hs.bmipfull.viewmodels.salemanmage.ConstructionSignModel;
import yl.hs.bmipfull.viewmodels.salemanmage.TimeGroupVO;

import java.text.ParseException;
import java.util.List;
import java.util.Map;

/*
 * IShipSettleService 发货结算单服务接口
 * @category 财务管理-发货结算
 * @author 谢景广
 * @date 2021-12-29
 */
public interface IShipSettleService extends IFinanceService{
    /**
     * 根据分页数据获取结算单的分页查询数据
     * @param query 查询条件集合
     * @param rowNum 分页大小，当分页大小为0获取的结算单为临时数据
     * @param page 分页页码，当分页大小为0时，页码失效
     * @return 分页数据集
     */
    PageResult<Map<String,Object>> queryPage(PageQuery query, int rowNum, int page) throws ParseException, Exception;


    /**
     * 根据分页数据获取结算单的分页查询数据
     * @param query 查询条件集合
     * @param rowNum 分页大小，当分页大小为0获取的结算单为临时数据
     * @param page 分页页码，当分页大小为0时，页码失效
     * @return 分页数据集
     */
    PageResult<Map<String,Object>> queryPageConstruction(PageQuery query, int rowNum, int page) throws ParseException, Exception;
    /**
     * 根据结算编号获取结算单的结算明细集合与结算辅助项集合
     * @param settleSN 结算单编号
     * @return 结算明细集合与结算辅助项集合
     */
    Map<String,Object> querySettleDetailsBySettleSN(String settleSN);

    /**
     * 根据合同编号和发货时间范围获取临时结算单明细
     * @param contractSN 合同编号
     * @param productCateSN 产品类别编号
     * @param startDate 开始发货时间
     * @param endDate 截至发货时间
     * @return 临时结算单明细集合
     */
    List<Map<String,Object>> queryTempSettleDetails(String contractSN,String productCateSN, String startDate, String endDate) throws ParseException;

    /**
     * 取消并删除结算信息
     * @param settleSN 结算编号
     * @return 取消删除结果
     */
    Integer cancelSettle(String settleSN);

    /**
     * 保存结算信息
     * @param submitModel 结算表单信息
     * @return 保存结果
     */
    Integer saveSettle(SubmitModel submitModel) throws Exception;

    /**
     * 根据合同Sn获取最后一个结算单
     * @param contractSn 合同sn
     * @return 结算单信息
     */
    ShipSettleMainEntity findLastByContractSn(String contractSn);

    /**
     *
     * @param sn 编号
     * @return
     */
    ShipSettleMainEntity findBySn(String sn);

    int updateExportCount(String sn);

    /**
     * 根据结算单编号获取对应的结算发货单信息
     * @param settleSN 结算单标识
     * @return 发货单集合
     */
    List<ProductShipOrderEntity> querySettleOrdersBySettleSN(String settleSN);

    /**
     * 根据结算单编号获取对应的结算发货单信息
     * @return 发货单集合
     */
    List<ProductShipOrderEntity> querySettleOrdersBySnList(String snList);

    /**
     * 获取时间分组信息
     * @return 获取时间分组信息
     */
    List<TimeGroupVO> getSetTimeGroup();

    /**
     * 获取工地用户的结算单分页列表
     * @param query 查询条件
     * @param rowNum 每页娴熟数据条目数
     * @param page 当前页码
     * @return 分页结果
     */
    PageResult<ShipSettleMainEntity> queryConstructionPage(PageQuery query, int rowNum, int page) throws Exception;

    /**
     *
     * @param model
     * @return
     */
    Integer saveSignInfo(ConstructionSignModel model);


    Integer GetConstructionNotSignedCount(PageQuery query) throws Exception;

    List<ShipSettleTemp> queryOrdersSettleDetails(String contractSN, String productCateSN, String startDate, String endDate) throws ParseException;

    List<Map<String,Object>> queryExportOrdersBySettleSN(String settleSN);
}
